package com.chenxiao.mybatisplus.utils;

import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * @Author: CX
 * @Date: Created in  2023/03/18 22:39
 * @version: v1.0
 * @Description: TODO
 **/
@Component
public class RedisUtil<ZSetOperations> {
        @Autowired
        private RedisTemplate redisTemplate;
        @Resource(name="redisTemplate")
        private ValueOperations<String, String> valueOperations;
       /* @Resource(name="redisTemplate")
        private HashOperations<String, String, Object> hashOperations;
        @Resource(name="redisTemplate")
        private ListOperations<String, Object> listOperations;
        @Resource(name="redisTemplate")
        private SetOperations<String, Object> setOperations;
        @Resource(name="redisTemplate")
        private ZSetOperations<String, Object> zSetOperations;*/

        /**  默认过期时长，单位：秒 */
        public final static long DEFAULT_EXPIRE = 60 * 60 * 24;
        /**  不设置过期时长 */
        public final static long NOT_EXPIRE = -1;

        public void set(String key, Object value, long expire){
            valueOperations.set(key, toJson(value));
            if(expire != NOT_EXPIRE){
                redisTemplate.expire(key, expire, TimeUnit.SECONDS);
            }
        }

        public void set(String key, Object value){
            set(key, value, DEFAULT_EXPIRE);
        }

        public <T> T get(String key, Class<T> clazz, long expire) {
            String value = valueOperations.get(key);
            if(expire != NOT_EXPIRE){
                redisTemplate.expire(key, expire, TimeUnit.SECONDS);
            }
            return value == null ? null : fromJson(value, clazz);
        }

        public <T> T get(String key, Class<T> clazz) {
            return get(key, clazz, NOT_EXPIRE);
        }

        public String get(String key, long expire) {
            String value = valueOperations.get(key);
            if(expire != NOT_EXPIRE){
                redisTemplate.expire(key, expire, TimeUnit.SECONDS);
            }
            return value;
        }

        public String get(String key) {
            return get(key, NOT_EXPIRE);
        }

        public void delete(String key) {
            redisTemplate.delete(key);
        }

        /**
         * Object转成JSON数据
         */
        private String toJson(Object object){
            if(object instanceof Integer || object instanceof Long || object instanceof Float ||
                    object instanceof Double || object instanceof Boolean || object instanceof String){
                return String.valueOf(object);
            }
            return JSON.toJSONString(object);
        }

        /**
         * JSON数据，转成Object
         */
        private <T> T fromJson(String json, Class<T> clazz){
            return JSON.parseObject(json, clazz);
        }
}
